/**
 * 问题：
 * 实现一个函数功能，当不传参数执行时候立即返回结果
 * add(1)() // 1
 * add(1)(2)() // 3
 * add(1)(2)(3)() // 4
 * add(1)(2)(3)(4)() // 10
*/


/**
 * @param {Function} fn 传入的函数
 * @return {Function} 返回一个单参调用的函数
*/
function curry(fn) {
  // 获取除fn之外的前置参数
  const args = Array.prototype.slice.call(arguments, 1)
  return function (...restArgs) {
    // 所有参数
    const allArgs = [...args, ...restArgs]
    if (restArgs.length === 0) {
      // 传的参数达到fn的参数长度才调用fn
      return fn.apply(null, allArgs)
    } else {
      // 否则递归调用curry
      return curry.call(null, fn, ...allArgs)
    }
  }
}


// 测试
function addFn() {
  return [...arguments].reduce((acc, num) => acc + num, 0)
}

const add = curry(addFn) 
console.log(add(1)()) // 1
console.log(add(1)(2)()) // 3
console.log(add(1, 2)(3)()) // 6
console.log(add(1)(2)(3)(4)()) // 10
console.log(add(1, 2, 3, 4, 5)()) // 15

const add2 = curry(addFn, 10)
console.log(add2(1)()) // 11
console.log(add2(1)(2)()) // 13
